"""
Quantstats分析器模块
"""
import os
import pandas as pd
import quantstats as qs
from loguru import logger
from .analyzer import Analyzer


class QuantstatsAnalyzer(Analyzer):
    """
    使用Quantstats库进行策略分析
    
    该分析器会生成一个完整的HTML报告，包含以下内容：
    - 收益率指标
    - 风险指标
    - 回撤分析
    - 月度/年度分析
    - 分布分析
    - 各种可视化图表
    """
    
    def __init__(self, trades, equity_curve, benchmark_returns=None):
        """
        初始化Quantstats分析器
        
        Parameters
        ----------
        trades : pandas.DataFrame
            交易记录
        equity_curve : pandas.DataFrame
            资金曲线
        benchmark_returns : pandas.Series, optional
            基准收益率序列，索引为datetime
        """
        super().__init__(trades, equity_curve)
        self._benchmark_returns = benchmark_returns
        self._returns = None
        self._stats = None
        
    def analyze(self):
        """
        分析回测结果
        
        Returns
        -------
        dict
            分析结果（基本统计指标）
        """
        # 计算策略收益率序列
        self._returns = self._equity_curve['equity'].pct_change().fillna(0)
        
        # 使用quantstats计算基本指标
        self._stats = {
            'cagr': qs.stats.cagr(self._returns),
            'sharpe': qs.stats.sharpe(self._returns),
            'sortino': qs.stats.sortino(self._returns),
            'max_drawdown': qs.stats.max_drawdown(self._returns),
            'win_rate': qs.stats.win_rate(self._returns),
            'avg_return': qs.stats.avg_return(self._returns),
            'volatility': qs.stats.volatility(self._returns),
            'calmar': qs.stats.calmar(self._returns),
            'omega': qs.stats.omega(self._returns)
        }
        
        return self._stats
        
    def save_html_report(self, output_dir='./reports', filename='quantstats_report.html', title='Strategy Report'):
        """
        生成并保存HTML分析报告
        
        Parameters
        ----------
        output_dir : str
            输出目录路径
        filename : str, optional
            输出文件名，默认为'quantstats_report.html'
        title : str, optional
            报告标题，默认为'Strategy Report'
            
        Returns
        -------
        str
            生成的HTML文件的完整路径
        """
        if self._returns is None:
            logger.warning("请先调用analyze()方法进行分析")
            return None
            
        try:
            # 确保输出目录存在
            os.makedirs(output_dir, exist_ok=True)
            
            # 构建完整的输出路径
            output_path = os.path.join(output_dir, filename)
            
            # 生成HTML报告
            if self._benchmark_returns is not None:
                # 如果有基准，生成带基准的报告
                qs.reports.html(
                    returns=self._returns,
                    benchmark=self._benchmark_returns,
                    output=output_path,
                    title=title,
                    download_filename=filename
                )
            else:
                # 如果没有基准，只生成策略的报告
                qs.reports.html(
                    returns=self._returns,
                    output=output_path,
                    title=title,
                    download_filename=filename
                )
            
            logger.info(f"Quantstats分析报告已保存到: {output_path}")
            return output_path
            
        except Exception as e:
            logger.error(f"生成Quantstats报告时发生错误: {str(e)}")
            return None
    
    def _get_stats_text(self):
        """
        获取统计指标文本
        
        Returns
        -------
        str
            统计指标文本
        """
        if self._stats is None:
            return ""
            
        return (
            "--- Quantstats统计 ---\n"
            f"年化收益率: {self._stats['cagr']:.2%}\n"
            f"夏普比率: {self._stats['sharpe']:.2f}\n"
            f"索提诺比率: {self._stats['sortino']:.2f}\n"
            f"最大回撤: {self._stats['max_drawdown']:.2%}\n"
            f"胜率: {self._stats['win_rate']:.2%}\n"
            f"平均收益: {self._stats['avg_return']:.2%}\n"
            f"波动率: {self._stats['volatility']:.2%}\n"
            f"卡玛比率: {self._stats['calmar']:.2f}\n"
            f"欧米伽比率: {self._stats['omega']:.2f}\n"
        ) 